﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HROReporting.Infrastructure.Domain;
using HROReporting.Infrastructure.UnitOfWork;
using HROReporting.Model.Docenten;
using HROReporting.Services.Interfaces;
using HROReporting.Services.Mapping;
using HROReporting.Services.Messaging.DocentService;
using HROReporting.Services.ViewModels;
using HROReporting.Model.PresentieIncheckingen;

namespace HROReporting.Services.Implementations
{
    public class DocentService : IDocentService
    {
        private readonly IDocentRepository _docentRepository;
        private readonly IUnitOfWork _uow;
        private readonly IPresentieIncheckingRepository _presentieIncheckRepository;

        public DocentService(IDocentRepository docentRepository, IUnitOfWork uow, IPresentieIncheckingRepository presentieIncheckRepository)
        {
            _docentRepository = docentRepository;
            _uow = uow;
            _presentieIncheckRepository = presentieIncheckRepository;
        }

        public void CreateDocent(CreateDocentRequest request)
        {
            throw new NotImplementedException();
        }

        public GetDocentByResponse GetDocentByDocentCode(GetDocentByRequest request)
        {
            GetDocentByResponse response = new GetDocentByResponse();

            response.Docent = _docentRepository.GetDocentByDocentCode(request.DocentCode).ConvertToDocentIndexView();

            return response;
        }

        public GetDocentByResponse GetDocentenByAchternaam(GetDocentByRequest request)
        {
            GetDocentByResponse response = new GetDocentByResponse();

            IEnumerable<Docent> docenten = _docentRepository.GetDocentenByAchternaam(request.Achternaam);

            response.Docenten = docenten.ConvertToDocentIndexView();

            return response;
        }

        public GetDocentByResponse GetDocentenByDocentCode(GetDocentByRequest request)
        {
            GetDocentByResponse response = new GetDocentByResponse();

            IEnumerable<Docent> docenten = _docentRepository.GetDocentenByDocentCode(request.DocentCode);

            response.Docenten = docenten.ConvertToDocentIndexView();

            return response;
        }

        public GetDocentByResponse GetDocentenBySchoolLocatie(GetDocentByRequest request)
        {
            GetDocentByResponse response = new GetDocentByResponse();

            IEnumerable<Docent> docenten = _docentRepository.GetDocentenBySchoolLocatie(request.SchoolLocatie);

            response.Docenten = docenten.ConvertToDocentIndexView();

            return response;
        }

        public GetDocentenByResponse GetDocentenByAchternaamTerm(GetDocentenByRequest request)
        {
            GetDocentenByResponse response = new GetDocentenByResponse();

            IEnumerable<Docent> docenten = _docentRepository.GetDocentenByAchternaamTerm(request.Achternaam);

            List<string> achternamen = new List<string>();

            foreach (Docent docent in docenten)
            {
                achternamen.Add(docent.Achternaam);
            }
            response.Termen = achternamen;
            response.Docenten = docenten.ConvertToDocentIndexView();

            return response;
        }

        public GetDocentenByResponse GetDocentenByDocentCodeTerm(GetDocentenByRequest request)
        {
            GetDocentenByResponse response = new GetDocentenByResponse();

            IEnumerable<Docent> docenten = _docentRepository.GetDocentenByDocentCodeTerm(request.DocentCode);

            List<string> docentcodes = new List<string>();

            foreach (Docent docent in docenten)
            {
                docentcodes.Add(docent.DocentCode.Code);
            }
            response.Termen = docentcodes;
            response.Docenten = docenten.ConvertToDocentIndexView();

            return response;
        }

        public GetDocentenByResponse GetDocentenBySchoolLocatieTerm(GetDocentenByRequest request)
        {
            GetDocentenByResponse response = new GetDocentenByResponse();

            IEnumerable<Docent> docenten = _docentRepository.GetDocentenBySchoolLocatieTerm(request.SchoolLocatie);

            List<string> locaties = new List<string>();

            foreach (Docent docent in docenten)
            {
                locaties.Add(docent.SchoolLocatie.Locatie);
            }
            response.Termen = locaties;
            response.Docenten = docenten.ConvertToDocentIndexView();

            return response;
        }

        public GetDocentByResponse GetDocentByAuthenticationToken(GetDocentByRequest request)
        {
            GetDocentByResponse response = new GetDocentByResponse();

            response.DocentModel = _docentRepository.GetDocentByAuthenticationToken(request.AuthenticationToken);
            response.Docent = _docentRepository.GetDocentByAuthenticationToken(request.AuthenticationToken).ConvertToDocentIndexView();
            
            return response;
        }

        public void CreatePresentielijst(CreatePresentielijstRequest request)
        {
            IEnumerable<Presentielijst> allPresentielijsten = _presentieIncheckRepository.GetPresentielijstenBySerial(request.NFCDevice.NFCDeviceSerial);

            int lesuur = Convert.ToInt32(request.LesuurEind.StartTijd.Replace(":", ""));
            foreach (Presentielijst lijst in allPresentielijsten)
            {
                if (lijst.Datum.Date == DateTime.Now.Date)
                {
                    if (lesuur <= Convert.ToInt32(lijst.LesuurEind.StartTijd.Replace(":", "")))
                    {
                        throw new InvalidOperationException("Er is al een presentielijst voor dit tijdstip.");
                    }
                }
            }

            Docent docent = request.Docent;

            Presentielijst presentieLijst = new Presentielijst();
            presentieLijst.Docent = docent;
            presentieLijst.NFCDevice = request.NFCDevice;
            presentieLijst.LesuurBegin = request.LesuurStart;
            presentieLijst.LesuurEind = request.LesuurEind;
            presentieLijst.Datum = request.Datum;
            presentieLijst.Opmerkingen = request.Opmerkingen;

            docent.Presentielijsten.Add(presentieLijst);

            _docentRepository.Add(docent);
            _uow.Commit();
        }


        public Presentielijst GetPresentielijstById(int id)
        {
            return _docentRepository.GetPresentielijstByPresentielijstId(id);
        }

        public IEnumerable<PresentieInchecking> GetPresentieByLijstId(int id)
        {
            return _docentRepository.GetPresentieByLijstId(id);
        }
    }
}
